package qf.service.serviceImpl;

import qf.dao.CartDao;
import qf.dao.GoodsDao;
import qf.dao.daoImpl.CartDaoImpl;
import qf.dao.daoImpl.GoodsDaoImpl;
import qf.pojo.Cart;
import qf.pojo.Goods;
import qf.service.CartService;
import qf.service.GoodsService;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 86198
 * @version V1.0
 * @Project Java_qf
 * @Package qf.service.serviceImpl
 * @Description:
 * @Date 2022/5/25 16:47
 */
public class CartServiceImpl implements CartService {
    private CartDao cartdao;

    public CartServiceImpl(CartDao cartdao){
        this.cartdao = cartdao;
    }

    @Override
    public boolean createCart(Integer uid, Integer pid) {
        //查询是否有此商品  并获取此商品对象
        GoodsDao goodsDao = new GoodsDaoImpl();
        GoodsService goodsService = new GoodsServiceImpl(goodsDao);
        Goods goods = goodsService.selectGoodsBYID(pid);

        //查询购物车 数据库 中是否有此用户添加过此商品
        Cart cart = cartdao.findCartByUidAndPid(uid, pid);

        //判断cart是否为空，为空此用户未添加过此商品
        //不等于空就代表此用户添加过此商品
        if (cart != null) {
            //获取购买件数
            cart.setNum(cart.getNum()+1);
            //将商品对象放入购物车中
            cart.setGoods(goods);
            //调用Dao层
            cartdao.update(cart);
        }else{
            cart = new Cart();
            //修改用户id
            cart.setUid(uid);
            //修改商品id
            cart.setPid(pid);
            //修改购买数量
            cart.setNum(1);
            //修改商品信息
            cart.setGoods(goods);
            //修改价格  //总价 = 购买数量 * 商品单价
            cart.setMoney(cart.getNum()*goods.getPrice());
            cartdao.addCart(cart);
        }


        return true;
    }

    @Override
    public List<Cart> selectCartByUid(Integer uid) {
        //查询用户的所有商品
        List<Cart> carts = cartdao.selectCartByUid(uid);
        //查询所有商品
        GoodsDaoImpl goodsDao = new GoodsDaoImpl();
        GoodsServiceImpl goodsService = new GoodsServiceImpl(goodsDao);
        List<Goods> goods = goodsService.showGoods();
        /**
         * 优化方案, 优化代码执行效率, 遍历次数 = cartList集合中的个数 + goodsList集合中的个数
         * 1. 将数据量多的集合, 放入Map<String, Goods>中
         * 2. 遍历另一个集合, 在遍历的过程中, 直接从map中get数据
         * 时间空间复杂度:
         * 时间: 程序执行的快慢可以用时间来表示, 执行的时间越少, 说明执行效率越高, 代码越优秀
         * 空间: 程序存储需要占用磁盘或者内存空间, 当然是占用的越少越好.
         * List 时间复杂度 S=O(n) 代表list中取数据, n代表list中元素的个数, 元素越多获取效率越慢
         * Map  时间复杂度 S=O(1) 代表map中取数据, 1代表map中不管有多少元素个数, 只需要一次就可以获取到
         */
        Map<String,Goods> goodmap = new HashMap<>();
        if (goods != null) {
        for (Goods good : goods) {
            goodmap.put(String.valueOf(good.getId()),good);
        }
        }

        if (carts != null) {
            for (Cart cart:carts) {
                Goods goods1 = goodmap.get(String.valueOf(cart.getPid()));
                if (goods1 != null) {
                    cart.setGoods(goods1);
                }
            }
        }
        return carts;
    }

    public void update (Integer cid, Integer num){
        //获取购物车内所有数据
        Cart cart = cartdao.selectCartByCid(cid);
        //根据cart id 获取商品id 并获取商品数据
        GoodsDaoImpl goodsDao = new GoodsDaoImpl();
        GoodsServiceImpl goodsService = new GoodsServiceImpl(goodsDao);
        Goods goods = goodsService.selectGoodsBYID(cart.getPid());

        //修改商品数量
        cart.setNum(num);
        //修改价格
        cart.setGoods(goods);
        //修改数据库中数据
        cartdao.update(cart);
    }
    @Override
    public void delect (Integer cid){
        cartdao.delete(cid);
    }
}
